import axios from "axios";
import router from "@/router";
// 非组件模块可以这样加载使用 element 的 message 提示组件
import { ElMessage, ElNotification } from "element-plus";
export const BaseUrl = "http://101.37.76.80:8899/kcwxy"

const request = axios.create({
  baseURL: BaseUrl,
  transformResponse: [
    function (data) {
      try {
        return JSON.parse(data);
      } catch (err) {
        return data;
      }
    },
  ],
});

request.interceptors.request.use(
  // 任何所有请求会经过这里
  // config 是当前请求相关的配置信息对象
  // config 是可以修改的
  function (config) {
    const token = window.localStorage.getItem("token");
    // 如果有登录用户信息，则统一设置 token
    if (token) {
      config.headers.Authorization = `${token}`;
    }

    // 然后我们就可以在允许请求出去之前定制统一业务功能处理
    // 例如：统一的设置 token

    // 当这里 return config 之后请求在会真正的发出去
    return config;
  },
  // 请求失败，会经过这里
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器
// Add a response interceptor
request.interceptors.response.use(
  function (response) {
    // 所有响应码为 2xx 的响应都会进入这里
    if (response.data.code === 200) {
      return response.data;
    }
    if (response.data.code === 405) {
      router.push("/login");
      ElMessage.error("登录状态无效，请重新登录");
      return response.data;
    }
    // 添加学生活添加老师存在
    if (response.data.code === 2005) {
      if (response.data.data[0] !== undefined) {
        ElNotification({
          showClose: true,
          title: `${response.data.data[0]?.studentNum || response.data.data[0]?.collageNum ||
            response.data.data[0]?.teacherNum} ${response.data.message}`,
          message: `使用者：${response.data.data[0]?.studentName || response.data.data[0]?.collageName ||
            response.data.data[0]?.teacherName
            }`,
          type: "error",
        });
      } else {
        ElNotification({
          showClose: true,
          title: `遇到错误`,
          message: `${response.data.message}`,
          type: "error",
        });
      }

      return response.data;
    }

    if (response.data.code !== 200 && response.data.code != 2003) {
      ElNotification({
        showClose: true,
        title: "遇到错误",
        message: response.data.message,
        type: "error",
      });
      return response.data;
    }
    // response 是响应处理
    // 注意：一定要把响应结果 return，否则真正发请求的位置拿不到数据
    return response.data;
  },
  function (error) {
    const { status } = error.response;
    // 任何超出 2xx 的响应码都会进入这里
    if (status === 401) {
      // 跳转到登录页面
      // 清除本地存储中的用户登录状态
      window.localStorage.removeItem("userId");
      window.localStorage.removeItem("token");
      router.push("/login");
      ElMessage.error("登录状态无效，请重新登录");
    } else if (status === 403) {
      // token 未携带或已过期
      ElMessage({
        type: "warning",
        message: "没有操作权限",
      });
    } else if (status === 400 || status == 405) {
      // 客户端参数错误
      ElMessage.error("参数错误，请检查请求参数");
    } else if (status >= 500) {
      ElMessage.error("服务端内部异常，请稍后重试");
    }

    return Promise.reject(error);
  }
);
export interface Data<T> {
  code: number;
  message: string;
  data: T;
}
export interface Response<T> {
  code: number;
  message: string;
  data: T;
}
export interface ListResp<T> {
  data: T[]
  total: number
}
export type ApiReturn<T> = Promise<Response<T>>;
export default request;

